/*
 * MockMiddlewareIO.cpp
 *
 *  Created on: 19/02/2010
 *      Author: San Martín, Matías I.
 */

#include "MockMiddlewareIO.h"
#include "../../../Aplicacion/Common/Mensajes/DatosMensajeFactory.h"
#include "../../../Aplicacion/Common/Mensajes/MensajeAplicacion.h"

#include <iostream>
#include <sstream>

using namespace std;
using namespace aplicacion;

MockMiddlewareIO::MockMiddlewareIO()
	: _msj(0),
	  _destino(0)
{
}

MockMiddlewareIO::~MockMiddlewareIO() {
}

bool MockMiddlewareIO::send(void* datos, Longitud ldatos, Direccion destino)
{
	stringstream stm;
	stm << "Mensaje para destino (" << destino << "): ";
	stm.write((char*)datos,ldatos);
	cout << stm << endl;
	return true;
}

bool MockMiddlewareIO::recv(void* datos)
{
	sleep(1); //agrego un retardo a la recepcion
	MensajeAplicacion msj;
	DatosMensaje* datosMsj = this->getDatos(_msj);

	IdJuego juego(1);
	IdJugador jugador(99,juego);

	msj.getEncabezado().setOrigen(jugador);
	msj.getEncabezado().setDestino(this->getDestino(_destino));
	msj.getEncabezado().setTipo(datosMsj->getTipo());
	msj.setDatos(datosMsj);

	msj.saveToArray(reinterpret_cast<uint8_t*>(datos));

	_msj = ++_msj % CANT_MSJS;
	_destino = ++_destino % CANT_DESTINOS;
	return true;
}

DatosMensaje* MockMiddlewareIO::getDatos(unsigned i)
{
	DatosMensaje* retDatos = NULL;
	switch (i) {
		case 0:
		{
			DatosCambiaDuenio* datos = DatosMensajeFactorySingleton::instance().createCambiaDuenio();

			IdJuego juego(2);
			IdJugador jugador(5,juego);
			datos->_duenioAnterior = jugador;

			jugador.setId(6);
			datos->_duenioNuevo = jugador;
			retDatos = datos;
			break;
		}

		case 1:
		{
			DatosCantidadNaves* datos = DatosMensajeFactorySingleton::instance().createCantidadNaves();

			datos->_cantidadNaves = 9999;
			retDatos = datos;
			break;
		}

		case 2:
		{
			DatosArriboNave* datos = DatosMensajeFactorySingleton::instance().createArriboNave();

			datos->_cantidadNavesFlota = 999;

			IdJuego juego(2);
			IdJugador jugador(5,juego);
			IdFlota flota(567,jugador);
			datos->_idFlota = flota;

			retDatos = datos;
			break;
		}
	}
	return retDatos;
}

IdPlaneta MockMiddlewareIO::getDestino(unsigned i)
{
	IdUniverso universo(1000);
	IdPlaneta planeta(5000 + i);
	return planeta;
}
